package fr.afcepf.atod21.data;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Types;
import java.util.List;

import javax.sql.DataSource;

import fr.afcepf.atod21.entity.Stagiaire;
import fr.afcepf.atod21.exception.Atod21Exception;

/**
 * @see IDaoStagiaire
 * @author Stagiaire
 */
public class DaoStagiaireImpl implements IDaoStagiaire {

    /**
     * DataSource pour l'acces a la BDD 'organisme_formation'.
     */
    private DataSource ds = new Atod21DataSource();

    /**
     * requete pour ajouter dans la BDD.
     */
    private final String reqAjout =
            "INSERT INTO stagiaire "
            + "(nom, prenom,adresse, date_naissance,id_organisme) "
            + "VALUES (?,?,?,?,?)";

    /**
     * Indice du parametre pour le nom du {@link Stagiaire}
     * dans la requete {@link DaoStagiaireImpl#reqAjout}.
     */
    private final int indiceNomReqAjout = 1;

    /**
     * Indice du parametre pour le prenom du {@link Stagiaire}
     * dans la requete {@link DaoStagiaireImpl#reqAjout}.
     */
    private final int indicePrenomReqAjout = 2;

    /**
     * Indice du parametre pour l'adresse du {@link Stagiaire}
     * dans la requete {@link DaoStagiaireImpl#reqAjout}.
     */
    private final int indiceAdresseReqAjout = 3;

    /**
     * Indice du parametre pour la date de naissance du {@link Stagiaire}
     * dans la requete {@link DaoStagiaireImpl#reqAjout}.
     */
    private final int indiceDateNaissanceReqAjout = 4;

    /**
     * Indice du parametre pour l'organisme du {@link Stagiaire}
     * dans la requete {@link DaoStagiaireImpl#reqAjout}.
     */
    private final int indiceOrganismeReqAjout = 5;

    /**
     * Constructeur par defaut.
     */
    public DaoStagiaireImpl() {
    }

    @Override
    public Stagiaire ajouter(Stagiaire paramStagiaire) throws Atod21Exception {
        try {
            Connection cnx = ds.getConnection();
            PreparedStatement pstatement = cnx.prepareStatement(reqAjout, Statement.RETURN_GENERATED_KEYS);
            pstatement.setString(indiceNomReqAjout, paramStagiaire.getNom());
            pstatement.setString(indicePrenomReqAjout, paramStagiaire.getPrenom());
            pstatement.setString(indiceAdresseReqAjout, paramStagiaire.getAdresse());
            pstatement.setObject(indiceOrganismeReqAjout, paramStagiaire.getOrganisme());
            pstatement.setDate(indiceDateNaissanceReqAjout,
                    new java.sql.Date(paramStagiaire.getDateNaissance().getTime()));

            if (paramStagiaire.getOrganisme() != null
                    && paramStagiaire.getOrganisme().getId() != 0) {
                pstatement.setInt(indiceOrganismeReqAjout, paramStagiaire.getOrganisme().getId());
            } else {
                pstatement.setNull(indiceOrganismeReqAjout, Types.INTEGER);
            }

            int resultatSql = pstatement.executeUpdate();
            if (resultatSql == 1) {
                ResultSet rs = pstatement.getGeneratedKeys();
                if (rs.next()) {
                    paramStagiaire.setId(rs.getInt(1));
                }
            }

        } catch (SQLException e) {
            throw new Atod21Exception("Erreur 1001 - DaoStagiaire->ajouter()" + e.getMessage());
        }
        return paramStagiaire;
    }


    @Override
    public List<Stagiaire> rechercher(String paramNom) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public List<Stagiaire> rechercher(int paramIdOrganisme) {
        // TODO Auto-generated method stub
        return null;
    }

    /**
     * Requete de renvoi (suppression) d'un {@link Stagiaire}.
     */
    private final String reqRenvoi =
            "UPDATE stagiaire set id_organisme = null "
            + "WHERE idstagiaire = ? and id_organisme = ?";
    /**
     * Indice du parametre idstagiaire de la requete reqRenvoi.
     */
    private final int indiceIdStagiaireRenvoi = 1;
    /**
     * Indice du parametre idorganisme de la requete reqRenvoi.
     */
    private final int indiceIdOrganismeRenvoi = 2;
    @Override
    public Stagiaire renvoi(Stagiaire paramStagiaire) throws Atod21Exception {
        try {
            Connection cnx = ds.getConnection();
            PreparedStatement pstatement = cnx.prepareStatement(reqRenvoi);
            pstatement.setInt(indiceIdStagiaireRenvoi, paramStagiaire.getId());
            pstatement.setInt(indiceIdOrganismeRenvoi, paramStagiaire.getOrganisme().getId());
            
            if (pstatement.executeUpdate() == 1) {
                paramStagiaire.setOrganisme(null);
            } else {
                throw new Atod21Exception("Erreur 1002 - DaoStagiaire->renvoi()"
                        + "Le stagiaire n'est pas dans cet organisme.");
            }

        } catch (SQLException e) {
            throw new Atod21Exception("Erreur 1002 - DaoStagiaire->renvoi()" + e.getMessage());
        }
        return paramStagiaire;
    }

}
